package cn.itcast.java.transaction;

import cn.itcast.java.jdbc.JDBCUtils;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Author itcast
 * Date 2021/10/14 15:16
 * Desc 读取数据表中数据
 * 开启事务
 * 更新 jack的money-1000  =>  rose 的money+1000
 * 如果影响的行数都 >0 commit提交
 * 如果出现异常说明当前程序异常，回滚数据
 */
public class TransactionDemo {

    private static Connection conn = null;

    private static Statement st = null;

    public static void main(String[] args) {
        /**
         * todo 1.加载mysql数据驱动
         * todo 2.获取连接
         * todo 3.通过连接关闭自动提交
         * todo 4.创建statement
         * todo 5.通过executeUpdate(sql) 执行两条语句并返回影响的行数
         * todo 6.如果两条影响的行数都 > 0 说明当前都执行成功，提交事务
         * todo 7.出现了异常，程序代码的回滚
         * todo 8.关闭连接
         */
        //todo 1.加载mysql数据驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //todo 2.获取连接
            conn = JDBCUtils.getConn();
            //todo 3.通过连接关闭自动提交
            conn.setAutoCommit(false);
            //todo 4.创建statement
            st = conn.createStatement();
            //todo 5.通过executeUpdate(sql) 执行两条语句并返回影响的行数
            //5.1 执行 jack - 1000
            int out = st.executeUpdate("update account SET money=money-1000 WHERE name='jack'");
            //给算数 /0 的异常 如果出现异常，就会回滚
            System.out.println(1/0);
            int in = st.executeUpdate("update account SET money=money+1000 WHERE name='rose'");
            //todo 6.如果两条影响的行数都 > 0 说明当前都执行成功，提交事务
            if (out > 0 && in > 0) {
                conn.commit();
            }
        } catch (ClassNotFoundException | SQLException e) {
            //todo 7.出现了异常，程序代码的回滚
            e.printStackTrace();
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            //todo 8.关闭连接
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                    if (st != null) st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
